﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

// Taken directly from Josh Smith of WPF:
// http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
// The only difference is the additon of a Type parameter
namespace Common.Logging.Loupe.Example
{
    public class RelayCommand<T> : ICommand 
    { 
        #region Fields 
        readonly Action<T> _execute; 
        readonly Predicate<T> _canExecute; 
        #endregion // Fields 
        
        #region Constructors 
        public RelayCommand(Action<T> execute) : this(execute, null) { } 
        
        public RelayCommand(Action<T> execute, Predicate<T> canExecute) 
        { 
            if (execute == null) throw new ArgumentNullException("execute"); 
            _execute = execute; _canExecute = canExecute; 
        } 
        #endregion // Constructors 
        
        #region ICommand Members 
        [DebuggerStepThrough] public bool CanExecute(object parameter) 
        {
            return _canExecute == null ? true : _canExecute((T) parameter); 
        }
        
        public event EventHandler CanExecuteChanged 
        { 
            add { CommandManager.RequerySuggested += value; } 
            remove { CommandManager.RequerySuggested -= value; } 
        } 
        
        public void Execute(object parameter) 
        {
            _execute((T) parameter); 
        }
        
        #endregion // ICommand Members 
    }
}
